/**
 * 
 */
package me.twoday.library.mine.common.network;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.Charset;

import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.InputStreamBody;
import org.apache.http.entity.mime.content.StringBody;

import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;

/**
 * HTTP POST 요청에 사용되는 클래스
 * 
 * @author 박우람
 * @since 2011.02.13
 */
public class HttpFileConnection extends HttpConnection
{
	private MultipartEntity mReqEntity;
	
	/**
	 * 기본이 되는 생성자.
	 * 
	 * @param httpHandler 처리 핸들러
	 */
	public HttpFileConnection(HttpHandler httpHandler)
	{
		super(httpHandler);
		mReqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
	}
	
	/**
	 * 문자열 형태의 파라미터를 입력합니다.
	 * 
	 * @param name 파라미터명
	 * @param value 파라미터값
	 */
	public void putParam(String name, String value)
	{
		try
		{
			mReqEntity.addPart(name, new StringBody(value, Charset.forName(DEFAULT_CHARACTER_SET)));
		}
		catch(UnsupportedEncodingException e)
		{
			e.printStackTrace();
		}
	}
	
	/**
	 * 정수 형태의 파라미터를 입력합니다.
	 * 
	 * @param name 파라미터명
	 * @param value 파라미터값
	 */
	public void putParam(String name, int value)
	{
		try
		{
			mReqEntity.addPart(name, new StringBody(Integer.toString(value), Charset.forName(DEFAULT_CHARACTER_SET)));
		}
		catch(UnsupportedEncodingException e)
		{
			e.printStackTrace();
		}
	}
	
	/**
	 * 비트맵 형태의 파라미터를 입력합니다.
	 * 
	 * @param name 파라미터명
	 * @param value 파라미터값
	 * @param filename 업로드할 파일명
	 */
	public void putParam(String name, Bitmap image, String filename)
	{
		ByteArrayOutputStream stream = new ByteArrayOutputStream();
		image.compress(CompressFormat.JPEG, 100, stream);
        byte[] byteArray = stream.toByteArray();
        
        // 파일 이름 인코딩
        try
		{
			filename = URLEncoder.encode(filename, DEFAULT_CHARACTER_SET);
		}
		catch(UnsupportedEncodingException e)
		{
		}
        
        mReqEntity.addPart(name, new InputStreamBody(new ByteArrayInputStream(byteArray), "image/jpeg", filename));
	}

	/* (non-Javadoc)
	 * @see com.starpl.platform.common.network.HttpConnection#run()
	 */
	@Override
	public void run()
	{
		try
		{
			executePreProcess();
			HttpPost httpPost = new HttpPost(mUrl);
			httpPost.setEntity(mReqEntity);
			httpPost.setHeader("Cookie", getCookieSessionKey());
			executePostProcess(mHttpClient.execute(httpPost));
		}
		catch(Exception e)
		{
			processNetworkError(e);
		}
	}
}
